PostgreSQL pg_bulkload 导入 BINARY 格式数据
1 背景知识
本章主要介绍如何使用 pg_bulkload 导入自定义生成的BINARY数据。
2 BINARY 格式数据单进程导入
2.1 上传 BINARY 格式数据
此 isbn.data
文件为导出 BINARY 格式数据所生成的 BINARY 格式数据文件,请上传到 /soft
目录。
ls -l /soft/isbn.data
//屏幕输出:
-rw------- 1 postgres postgres 255799131 May 7 16:32 /soft/isbn.data
2.2 创建表
创建用于装载 BINARY 数据的表 isbn
。
psql -U postgres -d testdb
DROP SCHEMA IF EXISTS zlibrary CASCADE;
CREATE SCHEMA zlibrary;
CREATE TABLE zlibrary.isbn (
zlibrary_id integer NOT NULL,
isbn character varying(13) NOT NULL
);
ALTER TABLE ONLY zlibrary.isbn
ADD CONSTRAINT "PRIMARY_9E9D7BB2" PRIMARY KEY (zlibrary_id, isbn);
ALTER TABLE ONLY zlibrary.isbn
ADD CONSTRAINT "isbn_id_2E99E8E3" UNIQUE (isbn, zlibrary_id);
2.3 创建控制文件
上传数据加载的控制文件 isbn.data.ctl
。此文件由导出 BINARY 格式数据生成,并修改为如下。
su - postgres
vi /soft/isbn.data.ctl
INPUT = /soft/isbn.data
OUTPUT = zlibrary.isbn
LOGFILE = /soft/isbn.data.log
PARSE_BADFILE = /soft/isbn.data.prs
DUPLICATE_BADFILE = /soft/isbn.data.dup
PARSE_ERRORS = INFINITE
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
SKIP = 0
LIMIT = INFINITE
CHECK_CONSTRAINTS = NO
MULTI_PROCESS = NO
VERBOSE = NO
TRUNCATE = YES
WRITER = DIRECT
TYPE = BINARY
COL = BIGINT (8)
COL = VARCHAR (13)
# ENCODING = UTF8
2.4 导入数据
单进程导入数据的耗时为 1m13.846s
。
time pg_bulkload -U postgres -d testdb isbn.data.ctl
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
0 Rows skipped.
12180911 Rows successfully loaded.
0 Rows not loaded due to parse errors.
0 Rows not loaded due to duplicate errors.
0 Rows replaced with new rows.
real 1m13.846s
user 0m0.001s
sys 0m0.010s
3 BINARY 格式数据并发导入
3.1 上传 BINARY 格式数据
此 isbn.data
文件为导出 BINARY 格式数据生成的 BINARY 格式数据,请上传到 /soft
文件夹。
ls /soft/isbn.data
3.2 创建控制文件
上传数据加载的控制文件 isbn.data.ctl
。此文件由导出 BINARY 格式数据生成,并参数修改为 MULTI_PROCESS = YES
。
su - postgres
vi /soft/isbn.data.ctl
INPUT = /soft/isbn.data
OUTPUT = zlibrary.isbn
LOGFILE = /soft/isbn.data.log
PARSE_BADFILE = /soft/isbn.data.prs
DUPLICATE_BADFILE = /soft/isbn.data.dup
PARSE_ERRORS = INFINITE
DUPLICATE_ERRORS = 0
ON_DUPLICATE_KEEP = NEW
SKIP = 0
LIMIT = INFINITE
CHECK_CONSTRAINTS = NO
MULTI_PROCESS = YES
VERBOSE = NO
TRUNCATE = YES
WRITER = DIRECT
TYPE = BINARY
COL = BIGINT (8)
COL = VARCHAR (13)
# ENCODING = UTF8
3.3 配置 .pgpass 文件
vi ~/.pgpass
//输入内容:
*:*:*:postgres:postgres
对于如何配置请参考 .pgpass 。
3.4 导入数据
time pg_bulkload -U postgres -d postgres isbn.data.ctl
NOTICE: BULK LOAD START
NOTICE: BULK LOAD END
0 Rows skipped.
12180911 Rows successfully loaded.
0 Rows not loaded due to parse errors.
0 Rows not loaded due to duplicate errors.
0 Rows replaced with new rows.
real 1m13.344s
user 0m0.002s
sys 0m0.006s
4 导入数据将会维护索引
导入数据后请查看索引的详细信息。发现数据量为 471MB
。
\x
\di+ zlibrary."isbn_id_2E99E8E3"
List of relations
-[ RECORD 1 ]-+-----------------
Schema | zlibrary
Name | isbn_id_2E99E8E3
Type | index
Owner | postgres
Table | isbn
Persistence | permanent
Access method | btree
Size | 471 MB
Description |